www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouS\PeerThread.cpp
// PeerThread.cpp: implementation of the PeerThread. // Download by http://www.NewXing.com ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "PeerThread.h" #include "globalhead.h" #include "peersocket.h" #include "CaptureScreen.h" #include "LZWCompress.h" #include "command.h" #include "peersysteminit.h" #include "peerregeditctrl.h" #include "peerfileoperator.h" #include "screenctrl.h" ////////////////////////////////////////////////////////////////////// CONNECTTHREADLIST listConnectThread; //客户连接线程列表 UNUSEDTHREADLIST listUnusedThread; //不用的线程句柄列表 CRITICAL_SECTION csProtectList; //只允许同时一个线程访问这些列表 /////////////////////////////// //接受远程连接的线程 UINT WINAPI AcceptThread(PVOID pParam) { CONNECTTHREAD connectthread; HANDLE hNewThread; DWORD dwNewThreadID; SOCKET s; WSAEVENT hEvnets[2]; SOCKADDR ClientAddr; SOCKADDR_IN ClientAddrIn; int iAddrLen = sizeof(ClientAddr); CONNECTSOCKET ConnectSocketInfo; if(!PeerCreateSocket(&s,PEER_STREAM)) { return -1; } if(!PeerBindSocket(s,szHostAddr,nHostPort)) { PeerCloseSocket(s); return -1; } if(!PeerListenSocket(s)) { PeerCloseSocket(s); return -1; } WSAEVENT hNetEvent = WSACreateEvent(); if(hNetEvent == WSA_INVALID_EVENT) { PeerCloseSocket(s); return -1; } hEvnets[0] = hExitEvent; hEvnets[1] = hNetEvent; int result = WSAEventSelect(s,hNetEvent,FD_ACCEPT); if(result == SOCKET_ERROR) { PeerCloseSocket(s); WSACloseEvent(hNetEvent); return -1; } //准备工作已经完毕 SetEvent(hPrepareEvent); //等候网络时间完成的环境变量 WSANETWORKEVENTS NetworkEvents; for(;;) { DWORD EventCaused = WSAWaitForMultipleEvents( 2, hEvnets, FALSE, WSA_INFINITE, FALSE); if(EventCaused == WSA_WAIT_FAILED || EventCaused == WAIT_OBJECT_0) { WSACloseEvent(hNetEvent); PeerCloseSocket(s); return -1; } result = WSAEnumNetworkEvents( s, hNetEvent, &NetworkEvents); if(result == SOCKET_ERROR) { WSACloseEvent(hNetEvent); PeerCloseSocket(s); return -1; } if(NetworkEvents.lNetworkEvents == FD_ACCEPT) { SOCKET ClientSocket = WSAAccept(s, &ClientAddr, &iAddrLen, NULL, NULL); if(INVALID_SOCKET == ClientSocket) { continue; } else { memcpy(&ClientAddrIn,&ClientAddr,sizeof(SOCKADDR_IN)); strcpy(ConnectSocketInfo.IP,inet_ntoa(ClientAddrIn.sin_addr)); ConnectSocketInfo.socket=ClientSocket; if((hNewThread=BeginPeerThread(ServerThread,&ConnectSocketInfo,&dwNewThreadID))==NULL) continue; else{ connectthread.hThread=hNewThread; connectthread.threadID=dwNewThreadID; EnterCriticalSection(&csProtectList); listConnectThread.push_back(connectthread); LeaveCriticalSection(&csProtectList); } } } } WSACloseEvent(hNetEvent); PeerCloseSocket(s); return 0; } ///////////////////////////////// //服务线程 ///////////////////////////////// UINT WINAPI ServerThread(PVOID pParam) { /////得到连接的socket////// CONNECTSOCKET SocketInfo; SocketInfo=*(CONNECTSOCKET*)pParam; SOCKET s; s=SocketInfo.socket; /////创建socket上的事件句柄//////// WSAEVENT hEvent=WSACreateEvent(); /////////////////////////////////// DWORD retLen; //返回数据长度 COMMAND command;//命令头 /////////////////////////////////// memset((char*)&command,0,sizeof(COMMAND)); if(!PeerRecvDataS(s,(char*)&command,sizeof(command),&retLen, hEvent,SENDRECV_TIMEOUT)) { PeerCloseSocket(s); WSACloseEvent(hEvent); DeleteThread(CUR_THREADID); return 0; } switch(command.CommandID) { case PEER_SYSTEM_INIT: //客户端循检时返回的系统信息 SYSTEMINIT si; if(GetPeerSystemInfo(si)) PeerSendDataS(s,(char*)&si,sizeof(si),&retLen,hEvent, SENDRECV_TIMEOUT); break; case PEER_REGEDIT_ENUMVALUE: PeerRegeditEnumValue(s,hEvent); break; case PEER_REGEDIT_ENUMKEY: PeerRegeditEnumKey(s,hEvent); break; case PEER_REGEDIT_CREATEKEY: PeerRegeditCreateKey(s,hEvent); break; case PEER_REGEDIT_DELETEKEY: PeerRegeditDeleteKey(s,hEvent); break; case PEER_REGEDIT_DELVALUE: PeerRegeditDelValue(s,hEvent); break; case PEER_REGEDIT_SETVALUE: PeerRegeditSetValue(s,hEvent); break; case PEER_REGEDIT_GETVALUE: PeerRegeditGetValue(s,hEvent); break; case PEER_FILE_GETDRIVER: PeerFileGetDriver(s,hEvent); break; case PEER_FILE_GETATTRIB: PeerFileGetAttrib(s,hEvent); break; case PEER_FILE_SAVEFILE: PeerFileSave(s,hEvent); break; case PEER_FILE_SENDFILE: PeerFileSend(s,hEvent); break; case PEER_FILE_CREATEDIR: PeerFileDirCreate(s,hEvent); break; case PEER_FILE_EXCUTE: PeerFileExcute(s,hEvent); break; case PEER_FILE_DELETEFILE: PeerFileDelete(s,hEvent); break; case PEER_KEYMOUSE: PeerScreenMouseKey(s,hEvent); break; case PEER_SCREEN_GET: PeerScreenGet(s,hEvent); CleanScreenInfo(); break; case PEER_FONTTEXT: PeerScreenWrite(s,hEvent); break; } WSACloseEvent(hEvent); PeerShutDownSocket(s); PeerCloseSocket(s); DeleteThread(CUR_THREADID); return 0; } ///////////////////////////// //清理已经完成操作的线程的线程 UINT WINAPI CleanupThread(PVOID pParam) { SetEvent(hPrepareEvent); UNUSEDTHREADLIST::iterator it; for(;;) { if(WaitForSingleObject(hExitEvent, PEER_CLEANTHREADTIME)==WAIT_TIMEOUT) { EnterCriticalSection(&csProtectList); while(listUnusedThread.size()) { HANDLE h = listUnusedThread.front(); DWORD n = WaitForSingleObject(h,PEER_KILLTHREADTIME); if(n==WAIT_TIMEOUT) { TerminateThread(h,0); } CloseHandle(h); listUnusedThread.pop_front(); } LeaveCriticalSection(&csProtectList); } else return 0; } return 0; } /////////////////////////// ///删除已经执行完成线程句柄 void DeleteThread(DWORD dwThreadID) { CONNECTTHREADLIST::iterator it; it=find_if(listConnectThread.begin(),listConnectThread.end(),bind2nd(IDCompare(),dwThreadID)); if(it!=listConnectThread.end()) { EnterCriticalSection(&csProtectList); listUnusedThread.push_back((*it).hThread); listConnectThread.erase(it); LeaveCriticalSection(&csProtectList); } } ////////////////////////////////////////////////////////////